package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.DeptService;
import com.itheima.service.EmpExprService;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {

     @Autowired
      private DeptService deptService;
      @Autowired
       private EmpExprService empExprService;
    @Override
    public PageResult<Emp> getPageResult(EmpQueryParam param) {
        /**
         * 分页+条件查询
         *
         * @param param
         * @return
         */
//        IPage <Emp> iPage = new Page(param.getPage(), param.getPageSize());// 分页对象
//        //调用service层的分页查询
//        IPage<Emp> page = page(iPage);
        //定义page对象进行分页(里面封装的有页数和显示条数)
        Page<Emp> iPage = new Page<>(param.getPage(), param.getPageSize());
        //根据更新时间进行排序
         iPage.addOrder(OrderItem.desc("update_time"));
         //调用servic的 分页查询
        LambdaQueryWrapper<Emp> wrapper = Wrappers.lambdaQuery();
        //设置查询条件,param.getName() 是前端传入的姓名关键字。
        if(!StringUtils.isEmpty(param.getName())){
            wrapper.like(Emp::getName, param.getName());
        }
        //设置性别 查询条件
        wrapper.eq(param.getGender() != null, Emp::getGender, param.getGender());
        //设置日期时间
        wrapper.between(param.getBegin() != null && param.getEnd() !=null, Emp::getEntryDate, param.getBegin(), param.getEnd());
        //调用分页查询方法,ipage(里面有page和pagesize)
        Page<Emp> result = page(iPage, wrapper);//此时result里面有total和records，返回时应用result
        //多表查询，因为 Emp实体类中没有deptName属性，所以需要多表查询
        //获取emp的部门id
        List<Emp> records = result.getRecords();
        List<Integer> deptIds= records.stream().map(emp -> emp.getDeptId()).toList();
        //有可能 有部门ID会重复
        deptIds = deptIds.stream().distinct().toList();
        if (! deptIds.isEmpty()) {
            //根据所有的部门id去获取名称
            List<Dept> depts = deptService.listByIds(deptIds);
            //使用双重循环
            records.stream().forEach( emp -> {
                depts.stream().filter( dept -> dept.getId().equals(emp.getDeptId()))
                        .findFirst() .ifPresent(dept -> emp.setDeptName(dept.getName()));
            });
        }
        //多表操作结束
        //3.组装数据
         return new PageResult<>(result.getTotal(), records);
    }

    @Override
    public void saveEmp(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setPassword("123456");
        //因为此时是在empserviceimpl的实现类中，可以直接使用save，因为Serviceimpl实现了 IService
        save( emp);
        //创建员工经历接口，在empserviceimpl中引用 empExprService
        List<EmpExpr> exprList = emp.getExprList();
        //设置id
         exprList.stream().forEach(expr->expr.setEmpId(emp.getId()));//直接对数据源进行修改
          empExprService.saveBatch(exprList);
    }

    @Override
    public Emp getbyid(Integer id) {
        // 根据id查询员工基本信息
         Emp emp = getById(id);
        //根据员工id查寻工作经历,是 MyBatis Plus 提供的工具类 Wrappers 的一个泛型方法。
        //<EmpExpr> 指定当前操作的是实体类 EmpExpr。
        //返回一个 LambdaQueryWrapper<EmpExpr>，可用于链式构建查询条件
        List<EmpExpr> list = empExprService.list(Wrappers.<EmpExpr>lambdaQuery().eq(EmpExpr::getEmpId, id));
        //封装数据
         emp.setExprList(list);
         return emp;
    }

    @Override
    public int updateEmp(Emp emp) {
        updateById( emp);
        //根据员工经理表看看是否有经历,要根据员工id
        long count = empExprService.count(Wrappers.<EmpExpr>lambdaQuery().eq(EmpExpr::getEmpId, emp.getId()));
        if(count>0){
            //有的话删除
            boolean remove = empExprService.remove(Wrappers.<EmpExpr>lambdaQuery().eq(EmpExpr::getEmpId, emp.getId()));
            if(!remove){
                return 0;
            }
        }
        // 批量保存
        List<EmpExpr> exprList = emp.getExprList();
        if(!CollectionUtils.isEmpty( exprList)){
            exprList.stream().forEach(expr -> expr.setEmpId( emp.getId()));
            empExprService.saveBatch(exprList);
        }
         return 1;
    }

    @Override
    public int deletebyids(List<Integer> ids) {
         // 批量删除员工信息
        boolean b = removeBatchByIds(ids);
        // 批量删除员工信息
        long count = empExprService.count(Wrappers.<EmpExpr>lambdaQuery().in(EmpExpr::getEmpId, ids));
         if(count>0){
             //此时里面有员工做经理
              boolean remove = empExprService.remove(Wrappers.<EmpExpr>lambdaQuery().in(EmpExpr::getEmpId, ids));
              return remove ? 1 : 0;
         }
          return b ? 1 : 0;
    }

//    @Autowired
//    private DeptService deptService;
//
//    @Override
//    public PageResult<Emp> getPageResult(EmpQueryParam param) {
//        Page<Emp> page = Page.of(param.getPage(), param.getPageSize());
//        page.addOrder(OrderItem.desc("update_time"));
//
//        // 借助于 lambdaQuery() 方法，构建查询条件，同时获取分页结果
//        page = lambdaQuery().like(param.getName() != null && !param.getName().isEmpty(), Emp::getName, param.getName())
//                .eq(param.getGender() != null, Emp::getGender, param.getGender())
//                .between(param.getBegin() != null && param.getEnd() != null, Emp::getEntryDate, param.getBegin(), param.getEnd())
//                .page(page);
//
//        List<Emp> emps = page.getRecords();
//
//        // 遍历emps结果，添加部门名称
//        emps.forEach(e -> {
//            Dept dept = deptService.getById(e.getDeptId());
//            if (dept != null && !dept.getName().isEmpty()) {
//                e.setDeptName(dept.getName());
//            }
//        });
//
//        return new PageResult<>(page.getTotal(), emps);
//    }
}
